// 动态地给某个对象添加一些额外的职责，，是一种实现继承的替代方案
// 在不改变原对象的基础上，通过对其进行包装扩展，使原有对象可以满足用户的更复杂需求，而不会影响从这个类中派生的其他对象

class Cellphone{
    create(){
        console.log("这是一个手机")
    }
}

class Decorator{
    cellphone:any
    constructor(cellphone){
        this.cellphone = cellphone
    }

    create(){
        this.cellphone.create();
        this.createShell();
    }

    createShell(){
        console.log("生产手机壳")
    }
}

let cellphlone = new Cellphone();
cellphlone.create();

// 

let dec = new Decorator(cellphlone);
dec.create();


// 场景例子
// 比如现在有4 种型号的自行车，我们为每种自行车都定义了一个单
// 独的类。现在要给每种自行车都装上前灯、尾
// 灯和铃铛这3 种配件。如果使用继承的方式来给
// 每种自行车创建子类，则需要 4×3 = 12 个子类。
// 但是如果把前灯、尾灯、铃铛这些对象动态组
// 合到自行车上面，则只需要额外增加3 个类
 
//  通过装饰器模式实现功能的动态组合

// 优点
// 装饰类和被装饰类都只关心自身的核心业务，实现了解耦。
// 方便动态的扩展功能，且提供了比继承更多的灵活性。

// 缺点
// 多层装饰比较复杂。
// 常常会引入许多小对象，看起来比较相似，实际功能大相径庭，从而使得我们的应用程序架构变得复杂起来